/****************************************************************************************************
 * 名称：是C运行时库中负责处理全局构造函数和析构函数的代码。
 * 版权 (C) 2025-现在 位中原
 * 描述：该文件的主要作用是在程序生命周期的关键时刻自动执行全局对象的构造和析构：
        在 main 函数执行之前，通过 run_ctors 初始化全局对象
        在 main 函数执行完毕后，通过 run_dtors 清理全局对象
        这是实现C++全局对象自动管理机制的核心部分，也支持了GCC的构造/析构函数属性扩展。
 ****************************************************************************************************/

/*
 * 符号命名约定处理:
在某些平台上（如Unix），符号名前不需要下划线
在其他平台上（如Windows），符号名前需要添加下划线
_(s) 宏用于统一处理这种差异
 */
#ifdef __leading_underscore
# define _(s) s
#else
# define _(s) _##s
#endif

/* 全局数组声明:
这些声明定义了四个重要的符号：
_init_array_start 和 _init_array_end：标记全局构造函数数组的开始和结束位置
_fini_array_start 和 _fini_array_end：标记全局析构函数数组的开始和结束位置
这些数组通常由链接器在链接时填充，包含了需要在程序启动和退出时执行的函数。
 */
extern void (*_(_init_array_start)[]) (int argc, _TCHAR **argv, _TCHAR **envp);
extern void (*_(_init_array_end)[]) (int argc, _TCHAR **argv, _TCHAR **envp);
extern void (*_(_fini_array_start)[]) (void);
extern void (*_(_fini_array_end)[]) (void);

/* 全局构造函数 */
static void run_ctors(int argc, _TCHAR **argv, _TCHAR **env)
{
    int i = 0;
    while (&_(_init_array_start)[i] != _(_init_array_end))
        (*_(_init_array_start)[i++])(argc, argv, env);
}

/* 全局析构函数 */
static void run_dtors(void)
{
    int i = 0;
    while (&_(_fini_array_end)[i] != _(_fini_array_start))
        (*_(_fini_array_end)[--i])();
}
